/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufms.facom.chatsocket.factory;

import br.ufms.facom.chatsocket.domain.Usuario;
import br.ufms.facom.chatsocket.exception.ArquivoNaoEncontradoException;
import br.ufms.facom.chatsocket.repositorio.RepositorioDeUsuario;
import br.ufms.facom.chatsocket.util.IOHelper;
import java.io.*;
import java.util.*;

/**
 * Fabrica de repositorio, encapsula os detalhes da complexa criação
 * do repositorio.
 * 
 * @author jairorodrigues
 */
public class FabricaDeRepositorioDeUsuario {
    
    private static String LISTA_USUARIOS_PATH = "listaDeUsuarios.ser";
    private static FabricaDeRepositorioDeUsuario instance = new FabricaDeRepositorioDeUsuario();
    private static List<Usuario> usuarios;

    public static FabricaDeRepositorioDeUsuario getInstance() {
        return instance;
    }
    
    /**
     * Carrega a lista de usuários do arquivo LISTA_USUARIOS_PATH
     * @return A List dos usuários persistidos no arquivo
     */
    private static List<Usuario> carregarListaDeUsuarios ()
    {
        if (usuarios == null)
        {
            try {
                usuarios = (List<Usuario>) new IOHelper().lerObjetoDeArquivo(LISTA_USUARIOS_PATH);
            } catch (ArquivoNaoEncontradoException ex) {
                usuarios = new LinkedList<Usuario>();
            }
        }
        
        return usuarios;
    }

    public RepositorioDeUsuario buildRepositorioDeUsuario ()
    {
        List<Usuario> listaDeUsuarios = carregarListaDeUsuarios();
        RepositorioDeUsuario repositorio = new RepositorioDeUsuario(listaDeUsuarios);
        
        return repositorio;
    }

    /**
     * Confirma as alterações feitas no repositório fabricado.
     * Deve ser executado no fim do uso do repositorio criado.
     */
    public void confirmarAlteracoes () 
    {
        if (usuarios == null) return;
        
        try {
            
            new IOHelper()
                    .salvarObjetoEmArquivo((Serializable) usuarios, LISTA_USUARIOS_PATH);
            
        } catch (ArquivoNaoEncontradoException ex) {
            // Ignora a exception
        }
    }
        
}
